<?php

/*
 * This file is part of the symfony package.
 * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

/**
 *
 * @package    symfony
 * @subpackage plugin
 * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
 * @version    SVN: $Id: sfGuardValidatorUser.class.php 25546 2009-12-17 23:27:55Z Jonathan.Wage $
 */
class sfGuardValidatorUser extends sfValidatorBase {

    public function configure($options = array(), $messages = array()) {
        $this->addOption('username_field', 'username');
        $this->addOption('password_field', 'password');
        $this->addOption('throw_global_error', false);

        $this->setMessage('invalid', 'The username and/or password is invalid.');
    }

    protected function doClean($values) {
        $username = isset($values[$this->getOption('username_field')]) ? $values[$this->getOption('username_field')] : '';
        $password = isset($values[$this->getOption('password_field')]) ? $values[$this->getOption('password_field')] : '';

        // don't allow to sign in with an empty username
        if ($username) {
            if (sfConfig::get('app_sf_guard_plugin_allow_login_with_email', true)) {
                $callable = sfConfig::get('app_sf_guard_plugin_retrieve_by_username_or_email_address_callable', array($this->getTable(), 'retrieveByUsernameOrEmailAddress'));
            } else {
                $callable = sfConfig::get('app_sf_guard_plugin_retrieve_by_username_callable', array($this->getTable(), 'retrieveByUsername'));
            }
            $user = call_user_func_array($callable, array($username));
            // user exists?
            if ($user) {
                // password is ok?
                if ($user->getIsActive() && $user->checkPassword($password)) {
                    return array_merge($values, array('user' => $user));
                }
            }
        }

        if ($this->getOption('throw_global_error')) {
            throw new sfValidatorError($this, 'invalid');
        }

        throw new sfValidatorErrorSchema($this, array($this->getOption('username_field') => new sfValidatorError($this, 'invalid')));
    }

    protected function getTable() {
        return Doctrine::getTable('sfGuardUser');
    }

}
